草庐IT

C++ Templates 多态障碍

全部标签

Java中的多态究竟是什么?

目录一.概念二.使用条件三.重写1.概念2.使用条件3.与重载对比4.举例5.为什么需要重写1.重写规则2.静态绑定--重载3.动态绑定--重写四.向上转型第一种传参方式:直接赋值第二种传参方式:通过传参优缺点五.向下转型举例缺点六.多态的优缺点优点缺点一.概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。二.使用条件1.必须是在继承情况下2.子类方法必须重写3.需由父类调用```javaclassAnimal{publicStringname;publicintage;publicAnimal(Stringname,intage){th

c++ - 指向多态类的悬挂指针会导致未定义的行为。它真的可以成为任何可以想象的腐败的根源吗?

我知道未定义行为一旦发生,就无法再考虑代码了。我完全相信。我什至认为我不应该深入了解UB:一个理智的C++程序不应该使用UB,Period。但为了让我的同事和经理相信它的真正危险,我试图找到一个具体的例子,我们的产品确实存在一个错误(他们认为这并不危险,最坏的情况是总是因访问冲突而崩溃)。我主要关心的是在指向多态类的悬垂指针上调用虚拟成员函数。当一个指针被删除时,Windows操作系统会在堆block的头部写入几个字节,通常也会覆盖堆block本身的第一个字节。这是它跟踪堆block的方式,将它们作为链表进行管理……操作系统的东西。虽然它没有在C++标准中定义,但多态性是使用虚拟表AF

c++ - 通过指向非多态类型的基类的指针获取已分配内存的地址

简单的多重继承structA{};structB{};structC:A,B{};或虚拟继承structB{};structC:virtualB{};请注意类型不是多态的。自定义内存分配:templateT*custom_new(Args&&args...){void*ptr=custom_malloc(sizeof(T));returnnew(ptr)T(std::forward(args)...);}templatevoidcustom_delete(T*obj){if(!obj)returnobj;void*ptr=get_allocated_ptr(obj);//hereass

C ++中的多态性。在基类上调用继承的方法

我正在尝试实现一个简单的文件系统。我有一个基类条目。我有两个从称为文件和目录的条目继承的类。目录包含条目对象列表。我有一种称为目录和文件的称为更改的方法,但没有输入。我希望我可以在输入对象上调用此方法,并且编译器会根据条目是目录还是文件来知道使用哪种方法。有什么方法可以做到这一点?classEntry{public:std::chrono::time_pointdateCreated;std::stringfileName;Entry(std::stringname);~Entry();};Directory*Directory::changeDir(Directory*dir,Directo

c++ - 如何在 C++ 中编写缓存友好的多态代码?

我正在写一段对性能要求很高的代码,需要用多态的方式处理大量的对象。假设我有一个A类和一个派生自A的B类。我现在可以像这样创建B:s的vectorvectora(n);for(inti=0;i但是如果n很大(在我的例子中是10^6或更多),这将需要对new进行非常多的调用,而且n个对象可能会分散在我的主内存中,从而导致缓存性能非常差.处理这种情况的正确方法是什么?我正在考虑做类似下面的事情,将所有对象放在一个连续的内存区域中。B*b=newB[n];vectora(n);for(inti=0;i但一个问题是如果b不再可用(但我们仍然有a),如何释放由newB[n]分配的内存。我刚刚了解到

c++ - clang 和 gcc 在使用智能指针时不会警告多态性的非虚基析构函数?

我们知道如果有虚函数那么基类析构函数也应该被标记为虚函数,否则当使用基类指针显式删除时它是未定义的行为如果我们希望删除带有基类指针的派生对象,基类析构函数应该被标记为虚拟的,否则就是未定义的行为。例如,structBase{virtualvoidgreet(){std::cout打电话Base*b=newDerived;b->greet();delete(b);当-Wdelete-non-virtual-dtor时,clang(gccsimilarly)会发出这样的警告:deletecalledon'Base'thathasvirtualfunctionsbutnon-virtuald

c++运算符重载的多态性

如何使纯虚函数成为operator+();功能。我在基础课上喜欢这个吗int运算符+()=0;编译器给出错误。在派生类operator+()函数中编译器说派生类不能使.因为下面的类是抽象的我知道我不能创建抽象类的对象,但现在我尝试创建派生类对象。这是代码#includeusingnamespacestd;classana{protected:intx;public:virtualintoperator+()=0;virtualvoidoperator=(ana&)=0;};classbaba:publicana{public:baba(intk){x=k;}intoperator+(b

c++ - 使用gdb的C++多态类中的vtable

这个问题在这里已经有了答案:PrintC++vtablesusingGDB(5个答案)关闭6年前。如何使用指向具有虚函数的基类对象的指针来显示虚表?

c++ - 使用动态多态时如何避免指针?

很长一段时间以来,我一直认为指针、new和delete在C++中有些不必要,除非处理长期存在的对象,引用是一种更简洁的替代方案更适合RAII模型。但是,我仍然无法确定在C++中使用动态多态性时如何避免指针。假设我们有这些类:classA{public:virtualvoida()const=0;};classB:publicA{virtualvoida()const{std::cout对象可以作为引用传递给invoke,并且不涉及指针(好吧,至少从程序员的角度来看)。然而,上面的例子本质上是静态多态。如果我想让b的类型依赖于其他东西,我将不得不使用指针:intmain(){A*a;if

c++ - 函数参数的多态性

好吧-这可能是一个非常愚蠢的问题,但它一直困扰着我。有没有一种语言classAnimal;classApe:publicAnimal{...}voiddoStuff(Animal*animalPtr){cout会产生“做类人猿的事情”?(请耐心等待我使用C++语法)澄清一下,我想要“一个接受参数并根据参数类型对其进行操作的函数”。这有意义吗?当然,作为开发人员,您需要小心,因为看起来像Animal指针的实例实际上可能会调用Ape代码,因为在运行时它指向的是Ape实例。 最佳答案 是的,有!这叫做multipledispatch.维基